home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
ARC
/
ARCEXT.MAC
< prev
next >
Wrap
Text File
|
1986-02-03
|
6KB
|
167 lines
$define(arc,$ifdef(xarc,off,on))# macro switch for ARC only code
$define(xarc,$ifdef(xarc,on,off))# macro switch for XARC only code
$emit($arc)#
/* ARC - Archive utility - ARCEXT
$define(tag,$$segment(@1,$$index(@1,=)+1))#
$define(version,Version $tag(
TED_VERSION DB =2.18), created on $tag(
TED_DATE DB =02/03/86) at $tag(
TED_TIME DB =22:55:19))#
$undefine(tag)#
$version
(C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
By: Thom Henderson
Description:
This file contains the routines used to extract files from
an archive.
Language:
Computer Innovations Optimizing C86
*/
#include <stdio.h>
#include "arc.h"
extarc(num,arg,prt) /* extract files from archive */
int num; /* number of arguments */
char *arg[]; /* pointers to arguments */
int prt; /* true if printing */
$emit($xarc)#
extarc() /* extract files from archive */
$emit(on)#
{
struct heads hdr; /* file header */
$emit($arc)#
int save; /* true to save current file */
int did[$maxarg]; /* true when argument was used */
char *i, *rindex(); /* string index */
char **name, *alloc(); /* name pointer list, allocator */
int n; /* index */
name = alloc(num*sizeof(char *)); /* get storage for name pointers */
for(n=0; n<num; n++) /* for each argument */
{ did[n] = 0; /* reset usage flag */
if(!(i=rindex(arg[n],'\\'))) /* find start of name */
if(!(i=rindex(arg[n],'/')))
if(!(i=rindex(arg[n],':')))
i = arg[n]-1;
name[n] = i+1;
}
$emit(on)#
openarc(0); /* open archive for reading */
$emit($arc)#
if(num) /* if files were named */
{ while(readhdr(&hdr,arc)) /* while more files to check */
{ save = 0; /* reset save flag */
for(n=0; n<num; n++) /* for each template given */
{ if(match(hdr.name,name[n]))
{ save = 1; /* turn on save flag */
did[n] = 1; /* turn on usage flag */
break; /* stop looking */
}
}
if(save) /* extract if desired, else skip */
extfile(&hdr,arg[n],prt);
else fseek(arc,hdr.size,1);
}
}
else while(readhdr(&hdr,arc)) /* else extract all files */
extfile(&hdr,"",prt);
$emit($xarc)#
while(readhdr(&hdr,arc)) /* extract all files */
extfile(&hdr);
$emit(on)#
closearc(0); /* close archive after reading */
$emit($arc)#
if(note)
{ for(n=0; n<num; n++) /* report unused args */
{ if(!did[n])
{ printf("File not found: %s\n",arg[n]);
nerrs++;
}
}
}
free(name);
$emit(on)#
}
$emit($arc)#
static extfile(hdr,path,prt) /* extract a file */
struct heads *hdr; /* pointer to header data */
char *path; /* pointer to path name */
int prt; /* true if printing */
$emit($xarc)#
static extfile(hdr) /* extract a file */
$emit(on)#
$define(use,$ife($arc,on,fix,hdr->name))#
{
FILE *f, *fopen(); /* extracted file, opener */
char buf[$strlen]; /* input buffer */
$emit($arc)#
char fix[$strlen]; /* fixed name buffer */
char *i, *rindex(); /* string index */
if(prt) /* printing is much easier */
{ unpack(arc,stdout,hdr); /* unpack file from archive */
printf("\f"); /* eject the form */
return; /* see? I told you! */
}
strcpy(fix,path); /* note path name template */
if(!(i=rindex(fix,'\\'))) /* find start of name */
if(!(i=rindex(fix,'/')))
if(!(i=rindex(fix,':')))
i = fix-1;
strcpy(i+1,hdr->name); /* replace template with name */
$emit(on)#
if(note)
printf("Extracting file: %s\n",$use);
if(warn)
{ if(f=fopen($use,"rb")) /* see if it exists */
{ fclose(f);
printf("WARNING: File %s already exists!",$use);
while(1)
{ printf(" Overwrite it (y/n)? ");
fgets(buf,$strlen,stdin);
*buf = toupper(*buf);
if(*buf=='Y' || *buf=='N')
break;
}
if(*buf=='N')
{ printf("%s not extracted.\n",$use);
fseek(arc,hdr->size,1);
return;
}
}
}
if(!(f=fopen($use,"wb")))
{ if(warn)
{ printf("Cannot create %s\n",$use);
nerrs++;
}
fseek(arc,hdr->size,1);
return;
}
/* now unpack the file */
unpack(arc,f,hdr); /* unpack file from archive */
setstamp(f,hdr->date,hdr->time); /* set the proper date/time stamp */
fclose(f); /* all done writing to file */
}